package com.example.rabc.dao;

import java.util.List;
import java.util.Optional;

/**
 * 基础DAO接口，定义所有实体类的公共操作
 * @param <T> 实体类型
 * @param <ID> 主键类型
 */
public interface BaseDao<T, ID> {
    /**
     * 保存实体
     * @param entity 实体对象
     * @return 保存后的实体对象
     */
    T save(T entity);
    
    /**
     * 根据ID更新实体
     * @param id 实体ID
     * @param entity 实体对象
     * @return 更新后的实体对象
     */
    T update(ID id, T entity);
    
    /**
     * 根据ID删除实体
     * @param id 实体ID
     */
    void deleteById(ID id);
    
    /**
     * 根据ID查找实体
     * @param id 实体ID
     * @return 实体对象的Optional包装
     */
    Optional<T> findById(ID id);
    
    /**
     * 查找所有实体
     * @return 实体列表
     */
    List<T> findAll();
    
    /**
     * 分页查询
     * @param page 页码（从0开始）
     * @param size 每页大小
     * @return 实体列表
     */
    List<T> findAll(int page, int size);
    
    /**
     * 根据条件查询实体数量
     * @return 实体数量
     */
    long count();
}
